package com.zenithmind.coding.pojo.entity;

import com.baomidou.mybatisplus.annotation.TableName;
import com.zenithmind.common.base.BaseEntity;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.time.LocalDateTime;
import java.util.Objects;

/**
 * 代码提交实体类 - 遵循单一职责原则，只包含提交的基本信息
 *
 * @author ZenithMind Team
 * @since 2025-01-09
 */
@Data
@EqualsAndHashCode(callSuper = true, onlyExplicitlyIncluded = true)
@TableName("coding_submission")
@Schema(description = "代码提交实体")
public class Submission extends BaseEntity {

    /**
     * 问题ID
     */
    @Schema(description = "问题ID")
    @EqualsAndHashCode.Include
    private String problemId;

    /**
     * 用户ID
     */
    @Schema(description = "用户ID")
    @EqualsAndHashCode.Include
    private String userId;

    /**
     * 用户名称
     */
    @Schema(description = "用户名称")
    private String userName;

    /**
     * 编程语言
     */
    @Schema(description = "编程语言")
    private String language;

    /**
     * 源代码
     */
    @Schema(description = "源代码")
    private String sourceCode;

    /**
     * 代码长度
     */
    @Schema(description = "代码长度")
    private Integer codeLength;

    /**
     * 提交状态（0-等待评判，1-评判中，2-通过，3-错误答案，4-时间超限，5-内存超限，6-运行错误，7-编译错误，8-系统错误）
     */
    @Schema(description = "提交状态（0-等待评判，1-评判中，2-通过，3-错误答案，4-时间超限，5-内存超限，6-运行错误，7-编译错误，8-系统错误）")
    private Integer status;

    /**
     * 状态描述
     */
    @Schema(description = "状态描述")
    private String statusMessage;

    /**
     * 是否公开（0-私有，1-公开）
     */
    @Schema(description = "是否公开（0-私有，1-公开）")
    private Integer isPublic;

    /**
     * 是否分享（0-否，1-是）
     */
    @Schema(description = "是否分享（0-否，1-是）")
    private Integer isShared;

    /**
     * 提交IP地址
     */
    @Schema(description = "提交IP地址")
    private String ipAddress;

    /**
     * 用户代理
     */
    @Schema(description = "用户代理")
    private String userAgent;

    /**
     * 提交来源（1-网页，2-API，3-IDE插件）
     */
    @Schema(description = "提交来源（1-网页，2-API，3-IDE插件）")
    private Integer submitSource;

    /**
     * 竞赛ID（如果是竞赛提交）
     */
    @Schema(description = "竞赛ID（如果是竞赛提交）")
    private String contestId;

    /**
     * 作业ID（如果是作业提交）
     */
    @Schema(description = "作业ID（如果是作业提交）")
    private String assignmentId;

    /**
     * 重写equals方法以确保里氏替换原则
     */
    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        if (!super.equals(obj)) return false;

        Submission that = (Submission) obj;
        return Objects.equals(problemId, that.problemId) &&
               Objects.equals(userId, that.userId) &&
               Objects.equals(language, that.language);
    }

    /**
     * 重写hashCode方法以确保里氏替换原则
     */
    @Override
    public int hashCode() {
        return Objects.hash(super.hashCode(), problemId, userId, language);
    }

    /**
     * 检查是否通过
     */
    public boolean isAccepted() {
        return Integer.valueOf(2).equals(this.status);
    }

    /**
     * 检查是否等待评判
     */
    public boolean isPending() {
        return Integer.valueOf(0).equals(this.status);
    }

    /**
     * 检查是否评判中
     */
    public boolean isJudging() {
        return Integer.valueOf(1).equals(this.status);
    }
}
